package com.jiuxian.scheduling.util;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wangjingqing on 2017/12/18.
 */
public class DubboUtil {


    /**
     * 获取dubbo远程对象<br>
     * @param tClass 指定对象
     * @param zkPath zk路径
     * @param version 版本
     * @param group 分组
     * @param <T>
     * @return Object
     */
    public static <T> Object getRpcObject(Class<T> tClass,String zkPath,String version,String group){
        // 当前应⽤配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("getRpcObject");

        // 注意：ReferenceConfig为重对象，内部封装了与注册中⼼的连接，以及与服务提供⽅的连接
        // 引⽤远程服务
        // 此实例很重，封装了与注册中⼼的连接以及与提供者的连接，请⾃⾏缓存，否则可能造成内存和连接泄漏
        ReferenceConfig reference = new ReferenceConfig<>();
        reference.setApplication(application);
        
        if(zkPath.contains(",")){//对个注册中心
            String[] paths = zkPath.split(",");
            List<RegistryConfig> list= new ArrayList<>();
            for(String info :paths){
                RegistryConfig registry = new RegistryConfig();
                registry.setAddress(info);
                list.add(registry);
            }
            reference.setRegistries(list);
        }else{
            RegistryConfig registry = new RegistryConfig();
            registry.setAddress(zkPath);
            reference.setRegistry(registry); // 多个注册中⼼可以⽤setRegistries()
        }
        reference.setInterface(tClass);
        reference.setVersion(version);
        reference.setGroup(group);
        // 和本地bean⼀样使⽤xxxService
        return reference.get(); // 注意：此代理对象内部封装了所有通讯细节，对象较重，请缓存复⽤
    }
}
